import pygame
import sys
from pygame.locals import *
from random import randint

# pygame初始化
pygame.init()
pygame.mixer.init()  # 为音频做准备
try:
    pygame.mixer.music.load('背景音乐.mp3')  # 导入音乐
    pygame.mixer.music.set_volume(0.2)  # 设置音量大小为20%
    pygame.mixer.music.play(loops=-1)  # 设置为-1使音乐循环播放
except:
    print("无法加载背景音乐")

# 尝试加载并缩放背景图片
try:
    original_bg = pygame.image.load('背景.jpg')
    # 缩放背景图片以适应窗口大小
    bg = pygame.transform.scale(original_bg, (1600, 900))
except:
    print("无法加载开始背景图")
    # 创建一个临时背景
    bg = pygame.Surface((1600, 900))
    bg.fill((255, 255, 255))
bg_position = bg.get_rect()

# 设置游戏窗口大小
size = width, height = 1600, 900
screen = pygame.display.set_mode(size)
pygame.display.set_caption('逃离莫塔里的土豆雷')  # 标题
clock = pygame.time.Clock()  # 创建时钟对象用于控制帧率


# 主函数
def main():
    class Up(pygame.sprite.Sprite):  # 定义要选择的游戏人物
        def __init__(self):
            super().__init__()  # 正确调用父类初始化方法，AI帮助我修改此处
            position = 100, 100  # 设置初始位置
            try:
                original_image = pygame.image.load('角色5.jpg')  # 加载原始游戏人物图像
                # 缩放人物图片为原始大小的10%
                self.image = pygame.transform.scale(original_image,
                                                    (int(original_image.get_width() * 0.1),
                                                     int(original_image.get_height() * 0.1)))
            except:
                print("无法加载游戏人物图像")
                # 创建一个临时人物
                self.image = pygame.Surface((50, 50))
                self.image.fill((0, 255, 0))
            self.rect = self.image.get_rect()  # 获取游戏人物的矩形区域
            self.rect.center = position  # 把区域设置为默认位置

        # 人物的移动方法
        # 向左移动
        def move_left(self):
            self.speed = [-5, 0]  # 向左移动速度为5个像素点每秒
            # 如果移动到左边界就将人物固定在左边界
            if self.rect.left <= 0:
                self.rect.left = 0
            # 否则正常移动
            else:
                self.rect = self.rect.move(self.speed)

        # 向右移动
        def move_right(self):
            self.speed = [5, 0]
            if self.rect.right >= width:
                self.rect.right = width
            else:
                self.rect = self.rect.move(self.speed)

        # 向上移动
        def move_up(self):
            self.speed = [0, -5]
            if self.rect.top <= 0:
                self.rect.top = 0
            else:
                self.rect = self.rect.move(self.speed)

        # 向下移动
        def move_down(self):
            self.speed = [0, 5]
            if self.rect.bottom >= height:
                self.rect.bottom = height
            else:
                self.rect = self.rect.move(self.speed)

    # 定义土豆雷
    class KLT(pygame.sprite.Sprite):
        # 定义初始化方法
        def __init__(self):
            super().__init__()  # 正确调用父类初始化方法，AI帮助我修改
            y = randint(0, height - 100)  # 设置y坐标，在0到窗口高度随机出现
            position = [width, y]  # 初始位置

            try:
                original_image = pygame.image.load('土豆雷.jpg')  # 加载原始土豆雷图片
                # 缩放土豆雷图片为原始大小的5%
                self.image = pygame.transform.scale(original_image,
                                                    (int(original_image.get_width() * 0.05),
                                                     int(original_image.get_height() * 0.05)))
            except:
                print("无法加载土豆雷图片")
                # 创建一个临时土豆雷
                self.image = pygame.Surface((50, 50))
                self.image.fill((255, 0, 0))
            self.rect = self.image.get_rect()  # 获取土豆雷的矩形区域
            self.rect.center = position  # 获取土豆雷初始位置

            self.speed = [-3, 0]  # 定义土豆雷的初始速度

        # 设置土豆雷移动方法
        def move(self):
            self.rect = self.rect.move(self.speed)

    # 对主循环进行初始化
    up = Up()  # 创建人物实例
    i = 0  # 计数器
    klt_group = pygame.sprite.Group()  # 管理土豆雷的组
    state = True  # 游戏状态设置为True运行中

    # 设置主循环
    while state:
        for event in pygame.event.get():  # 用以获取所有事件
            if event.type == pygame.QUIT:  # 如果点击关闭按钮
                pygame.quit()
                sys.exit()  # 退出游戏

        # 设置键盘控制
        key = pygame.key.get_pressed()  # 获取键盘按键状态
        if key[K_LEFT]:  # 按下左箭头
            up.move_left()  # 调用人物移动左方法
        if key[K_RIGHT]:
            up.move_right()
        if key[K_UP]:
            up.move_up()
        if key[K_DOWN]:
            up.move_down()

        # 设置游戏画面更新
        screen.blit(bg, bg_position)  # 绘制背景图片
        screen.blit(up.image, up.rect)  # 绘制人物图片

        # 让土豆雷在屏幕右侧随机大量出现
        i = i + 1  # 计数器递增
        if i % 10 == 0:  # 每十帧出现一只土豆雷
            klt = KLT()
            klt_group.add(klt)  # 将土豆雷添加到组

        # 判断功能，当人物碰到土豆雷时游戏结束
        for k in klt_group.sprites():  # 遍历每一个土豆雷
            k.move()
            # 移除已经移出屏幕的土豆雷
            if k.rect.right < 0:
                klt_group.remove(k)
                continue
            screen.blit(k.image, k.rect)  # 绘制土豆雷形象
            if pygame.sprite.collide_rect(up, k):  # 检测是否发生碰撞
                state = False
                pause()  # 调用结束函数

        # 设置画面刷新和帧率控制
        pygame.display.flip()  # 更新显示画面
        clock.tick(60)  # 设置帧率为60


# 设置游戏结束函数 pause
def pause():
    global screen, width, height  # 声明使用全局变量
    try:
        original_bg_go = pygame.image.load('莫塔里的大手.jpg')  # 加载原始游戏结束图片
        # 缩放游戏结束背景图片以适应窗口大小
        bg_go = pygame.transform.scale(original_bg_go, (width, height))
    except:
        print("无法加载游戏结束图片")
        # 创建一个临时结束背景
        bg_go = pygame.Surface((width, height))
        bg_go.fill((0, 0, 0))
    bg_go_pos = bg_go.get_rect()

    pygame.display.set_caption('GameOver')  # 设置游戏结束标题

    try:
        original_button = pygame.image.load('重来按钮.jpg')  # 加载原始重玩按钮图片
        # 缩放按钮图片为原始大小的10%
        img_src = pygame.transform.scale(original_button,
                                         (int(original_button.get_width() * 0.1),
                                          int(original_button.get_height() * 0.1)))
    except:
        print("无法加载重玩按钮图片")
        # 创建一个临时按钮
        img_src = pygame.Surface((200, 100))
        img_src.fill((255, 255, 0))

    img_src_pos = img_src.get_rect()
    img_src_pos.center = (width // 2, height // 2 + 100)  # 设置按钮位置在屏幕中央偏下

    # 用于控制游戏结束流程
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 重玩功能
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()
            # 鼠标点击事件处理
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:  # 左键点击
                    if img_src_pos.collidepoint(event.pos):  # 检查是否点击了按钮
                        main()  # 重新开始游戏

        # 始终绘制普通按钮，移除了鼠标悬停效果
        screen.blit(bg_go, bg_go_pos)  # 绘制游戏结束背景
        screen.blit(img_src, img_src_pos)  # 绘制普通按钮

        pygame.display.flip()  # 更新显示


if __name__ == "__main__":
    main()